package it.ap.sa.core.dao.util.sort;

import org.hibernate.criterion.Order;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Classe di ordinamento della tabella @URuntimePolicy.
 * 
 * @author marianna
 */
public class OrderDecoderTRuntimePolicy implements ISortColType {
	
	private static final Logger logger = LoggerFactory.getLogger(OrderDecoderTRuntimePolicy.class.getName());

	/**
	 * Indice di riferimento per l'ordinamento delle colonne della tabella u_runtime_policy,
	 * per le query effettuate usando i criteria.
	 */
	public static enum ISortColURuntimePolicyCriteria {
		
		_defaultColSort("userins"),
	    _defaultColDir(ISortColType.SORT_DIR.DESC.value()),
	    _1("id"),
	    _2("userins"),
	    _3("dateins"),
	    _4("usermod"),
	    _5("datemod"),
	    _6("userins"),
	    _7("state"),
	    _8("eseguitaIl");
		
		private final String value;

		ISortColURuntimePolicyCriteria(String v) {
	        value = v;
	    }

	    public String value() {
	        return value;
	    }

	    public static String fromValue(String v) {
			for (ISortColURuntimePolicyCriteria c : ISortColURuntimePolicyCriteria.values()) {
				if (c.value.equals(v)) {
					return c.toString();
				}
			}
		   throw new IllegalArgumentException();
		}
	    
	    public static String fromName(String n) {
			for (ISortColURuntimePolicyCriteria c : ISortColURuntimePolicyCriteria.values()) {
				if (c.toString().equals(n)) {
					return c.value();
				}
			}
		   throw new IllegalArgumentException();
		}
	}

	
	/**
	 * Indice di riferimento per l'ordinamento delle colonne della tabella u_runtime_policy,
	 * per le query effettuate con l'uso dell'sql query.
	 */
	public static enum ISortColURuntimePolicySql {
		
		_defaultColSort("userins"),
	    _defaultColDir(ISortColType.SORT_DIR.DESC.value()),
	    _1("id"),
	    _2("userins"),
	    _3("dateins"),
	    _4("usermod"),
	    _5("datemod"),
	    _6("userins"),
	    _7("state"),
	    _8("eseguitaIl");
		
		private final String value;

		ISortColURuntimePolicySql(String v) {
	        value = v;
	    }

	    public String value() {
	        return value;
	    }

	    public static String fromValue(String v) {
			for (ISortColURuntimePolicySql c : ISortColURuntimePolicySql.values()) {
				if (c.value.equals(v)) {
					return c.toString();
				}
			}
		   throw new IllegalArgumentException();
		}
	    
	    public static String fromName(String n) {
			for (ISortColURuntimePolicySql c : ISortColURuntimePolicySql.values()) {
				if (c.toString().equals(n)) {
					return c.value();
				}
			}
		   throw new IllegalArgumentException();
		}
	}

	/**
	 * Ritorna loggetto order per le query eseguite con i criteria.
	 * 
	 * @param iSortCol, Column being sorted on (you will need to decode this number for your database)
	 * @param sSortDir, Direction to be sorted - "desc" or "asc".
	 * 
	 * @return {@link Order}
	 * @throws Exception
	 */
	public static Order getOrderToCriteria(int iSortCol, String sSortDir) throws Exception{
		Order order = null;
		try{
			
			switch (sSortDir) {
				case "ASC": case "asc":{
					order = Order.asc(ISortColURuntimePolicyCriteria.fromName(ISortColType.PREFIX_INDEX_ICOL + iSortCol));
					break;
				}
				case "DESC": case "desc":{
					order = Order.desc(ISortColURuntimePolicyCriteria.fromName(ISortColType.PREFIX_INDEX_ICOL + iSortCol));
					break;
				}
				default:{
					order = getDefaultOrderToCriteria(); 
					break;
				}
			}
		}catch(Exception e){
			logger.error("Index iSortCol : " + iSortCol + " - NON PREVISTO - uso ordinamento di default. " + e, e);
			
			/** L'order ritornato in caso di errore è quello di default */
			order = getDefaultOrderToCriteria(); 
		}
	  return order;
	}
	
	/**
	 * Ritorna l'oggetto order di default per query esguite con i Criteria. 
	 * 
	 * @return {@link Order}
	 */
	public static Order getDefaultOrderToCriteria(){
		Order defaultOrder = null;
		
		switch (ISortColURuntimePolicyCriteria.fromName(ISortColType.key_defaultColDir)) {
			case "ASC": case "asc":{
				defaultOrder = Order.asc(ISortColURuntimePolicyCriteria.fromName(ISortColType.key_defaultColSort));
				break;
			}
			case "DESC": case "desc":{
				defaultOrder = Order.desc(ISortColURuntimePolicyCriteria.fromName(ISortColType.key_defaultColSort));
				break;
			}
		}
		
		return defaultOrder;
	}
	
	/**
	 * Ritorna loggetto order per le query eseguite con sql query.
	 * 
	 * @param iSortCol, Column being sorted on (you will need to decode this number for your database)
	 * @param sSortDir, Direction to be sorted - "desc" or "asc".
	 * 
	 * @return {@link String}
	 * @throws Exception
	 */
	public static String getOrderToSql(int iSortCol, String sSortDir) throws Exception{
		String order = null;
		try{
			
			/** Es: ORDER BY <nome_proprieta> <sort_direction> **/
			order = " ORDER BY " + ISortColURuntimePolicySql.fromName(ISortColType.PREFIX_INDEX_ICOL + iSortCol) + " " + sSortDir;
			
		}catch(Exception e){
			logger.error("Index iSortCol : " + iSortCol + " - NON PREVISTO - uso ordinamento di default. " + e, e);
			
			/** L'order ritornato in caso di errore è quello di default */
			order = getDefaultOrderToSql(); 
		}
	  return order;
	}
	
	/**
	 * Ritorna l'oggetto order di default per query eseguite con sql query. 
	 * 
	 * @return {@link String}
	 */
	public static String getDefaultOrderToSql(){
		/** Es:  ORDER BY <nome_proprieta> <sort_direction> **/
		String orderBy = " ORDER BY " + ISortColURuntimePolicySql.fromName(ISortColType.key_defaultColSort) + " " + ISortColURuntimePolicySql.fromName(ISortColType.key_defaultColDir);
		
		return orderBy;
	}
}
